package springboot.file.demo.util;

import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import springboot.file.demo.pojo.vo.BaseVo;
import springboot.file.demo.pojo.vo.ExcelDto;
import springboot.file.demo.service.ExportExcelService;

import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Author: jxm
 * @Description:
 * @Date: 2023/3/22 10:59
 * @Version: 1.0
 */
@Component
public class ExportExcelUtils {

    @Autowired
    ExportExcelService exportExcelService;

    public void createExcel(List<ExcelDto> list, ServletOutputStream out) throws IllegalAccessException, IOException {

        //订单来源
        Map<Integer,List<ExcelDto.OrderSourceSave>> orderSourceMap = new HashMap<>();
        //销售区域排行
        Map<Integer,List<ExcelDto.AreaSalesSave>> areaSalesMap = new HashMap<>();
        //商品销售量
        Map<Integer,List<ExcelDto.GoodsSalesSave>> goodsSalesMap = new HashMap<>();
        //物流公司包裹
        Map<Integer,List<ExcelDto.LogisticsSave>> logisticsMap = new HashMap<>();
        //区域商品销量排行
        Map<Integer,List<ExcelDto.GoodsAreaSalesSave>> goodsAreaSalesMap = new HashMap<>();
        //设施设备
        Map<Integer,List<ExcelDto.DeviceSave>> deviceMap = new HashMap<>();
        //业务类型
        Map<Integer,List<ExcelDto.BussTypeSave>> bussTypeMap = new HashMap<>();
        //发货量历史明细
        Map<Integer,List<ExcelDto.DeliveringDetailSave>> deliveringDetailMap = new HashMap<>();

        //判断有多少个sheet
        for (int i = 0; i < list.size(); i++) {
            ExcelDto data = list.get(i);
            //订单来源
            if(!StringUtils.isEmpty(data.getOrderSourceSaveList())){
                orderSourceMap.put(data.getPlaceId(),data.getOrderSourceSaveList());
            }
            //销售区域排行
            if(!StringUtils.isEmpty(data.getAreaSalesSaveList())){
                areaSalesMap.put(data.getPlaceId(),data.getAreaSalesSaveList());
            }
            //商品销售量
            //物流公司包裹
            //区域商品销量排行
            //设施设备
            if(!StringUtils.isEmpty(data.getDeviceSaveList())){
                deviceMap.put(data.getPlaceId(),data.getDeviceSaveList());
            }
            //业务类型
            //发货量历史明细

        }
        //放sheet名称
        List<String> sheetNames = new ArrayList<>();
        if (!orderSourceMap.isEmpty()){
            sheetNames.add("订单来源");
        }
        if (!areaSalesMap.isEmpty()){
            sheetNames.add("销售区域排行");
        }
        if (!goodsSalesMap.isEmpty()){
            sheetNames.add("商品销售量");
        }
        if (!logisticsMap.isEmpty()){
            sheetNames.add("物流公司包裹");
        }
        if (!goodsAreaSalesMap.isEmpty()){
            sheetNames.add("区域商品销量排行");
        }
        if (!deviceMap.isEmpty()){
            sheetNames.add("设施设备");
        }
        if (!bussTypeMap.isEmpty()){
            sheetNames.add("业务类型");
        }
        if (!deliveringDetailMap.isEmpty()){
            sheetNames.add("发货量历史明细");
        }

        //创建一个Workbook，对应一个Excel文件
        XSSFWorkbook wb = new XSSFWorkbook();
        for (String sheetName : sheetNames) {
            //创建sheet
            if(sheetName.equals("设施设备")){

                //创建sheet名称
                XSSFSheet sheet = wb.createSheet(sheetName);

                /** 设置样式以及字体样式*/
                XSSFCellStyle contentStyle = createContentCellStyle(wb);

                //1.创建行
                //行号
                int rowNum = 0;
                //1.1创建第一行
                /** 创建第一页的第一行，索引从0开始*/
                XSSFRow row0 = sheet.createRow(rowNum++);
                //1.1.1 第一个单元格
                XSSFCell c00 = row0.createCell(0);
                c00.setCellValue("序号");
                //设置单元格样式
                c00.setCellStyle(contentStyle);
                // 合并单元格，参数依次为起始行，结束行，起始列，结束列 （索引0开始）
                sheet.addMergedRegion(new CellRangeAddress(0, 2, 0, 0));
                //1.1.2 第二单元格
                XSSFCell c01 = row0.createCell(1);
                c01.setCellValue("业务发生时间");
                //设置单元格样式
                c01.setCellStyle(contentStyle);
                sheet.addMergedRegion(new CellRangeAddress(0, 2, 1, 1));
                //1.1.3 第三单元格
                XSSFCell c02 = row0.createCell(2);
                c02.setCellValue("云仓名称");
                sheet.addMergedRegion(new CellRangeAddress(0, 2, 2, 2));
                //1.1.4 第四单元格
                XSSFCell c03 = row0.createCell(3);
                String title = "业务期间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
                c03.setCellValue(title);
                //设置单元格样式
                c03.setCellStyle(contentStyle);
                // 合并单元格，参数依次为起始行，结束行，起始列，结束列 （索引0开始）
                sheet.addMergedRegion(new CellRangeAddress(0, 0, 3, 13));
                //1.2创建第二行
                XSSFRow row1 = sheet.createRow(rowNum++);
                //1.1.1 第四个单元格
                XSSFCell c13 = row1.createCell(3);
                c13.setCellValue("基础资料");
                //设置单元格样式
                c13.setCellStyle(contentStyle);
                // 合并单元格，参数依次为起始行，结束行，起始列，结束列 （索引0开始）
                sheet.addMergedRegion(new CellRangeAddress(1, 1, 3, 10));
                //1.1.1 第五个单元格
                XSSFCell c14 = row1.createCell(11);
                c14.setCellValue("设施设备");
                //设置单元格样式
                c14.setCellStyle(contentStyle);
                // 合并单元格，参数依次为起始行，结束行，起始列，结束列 （索引0开始）
                sheet.addMergedRegion(new CellRangeAddress(1, 1, 11, 13));
                //1.3创建第三行
                XSSFRow row3 = sheet.createRow(rowNum++);
                //1.3.1 第四个单元格
                XSSFCell c23 = row3.createCell(3);
                c23.setCellValue("云仓地址");
                //1.3.1 第5个单元格
                XSSFCell c24 = row3.createCell(4);
                c24.setCellValue("建仓时间");
                //1.3.1 第6个单元格
                XSSFCell c25 = row3.createCell(5);
                c25.setCellValue("仓库面积");
                //1.3.1 第6个单元格
                XSSFCell c26 = row3.createCell(6);
                c26.setCellValue("使用面积");
                //1.3.1 第6个单元格
                XSSFCell c27 = row3.createCell(7);
                c27.setCellValue("最大业务承载量");
                //1.3.1 第6个单元格
                XSSFCell c28 = row3.createCell(8);
                c28.setCellValue("仓库来源");
                //1.3.1 第6个单元格
                XSSFCell c29 = row3.createCell(9);
                c29.setCellValue("仓库价格");
                //1.3.1 第6个单元格
                XSSFCell c210 = row3.createCell(10);
                c210.setCellValue("仓库系统");

                //设施设备
                XSSFCell c211 = row3.createCell(11);
                c211.setCellValue("设备名称");
                XSSFCell c212 = row3.createCell(12);
                c212.setCellValue("实际数量");
                XSSFCell c213 = row3.createCell(13);
                c213.setCellValue("单位");

                //填充数据
                for (Map.Entry<Integer, List<ExcelDto.DeviceSave>> entry : deviceMap.entrySet()) {
                    Integer placeId = entry.getKey();
                    List<ExcelDto.DeviceSave> value = entry.getValue();
                    //查询基础信息
//                    BasicsInfo basicsInfo = basicsInfoService.getNewInfoByPlaceId(placeId);
                    List<Object> data = exportExcelService.getData();
                    //创建行
                    XSSFRow row4 = sheet.createRow(rowNum++);
                    for(int i = 0;i<11;i++){
                        XSSFCell c1 = row4.createCell(i);
                        c1.setCellValue(data.get(i).toString());
                        sheet.addMergedRegion(new CellRangeAddress(3, value.size()+2, i, i));
                    }
                    //合并单元格，参数依次为起始行，结束行，起始列，结束列 （索引0开始）
//                    sheet.addMergedRegion(new CellRangeAddress(3, value.size()+rowNum, 0, 9));

                    for (int i = 0; i < value.size(); i++) {
                        //创建行
                        XSSFRow row = row4;
                        if(i>0){
                            row = sheet.createRow(rowNum++);
                        }
                        //创建第一单元格
                        XSSFCell c1 = row.createCell(11);
                        c1.setCellValue(value.get(i).getDeviceName());
                        //创建第二单元格
                        XSSFCell c2 = row.createCell(12);
                        c2.setCellValue(value.get(i).getDeviceNum());
                        //创建第三单元格
                        XSSFCell c3 = row.createCell(13);
                        c3.setCellValue(value.get(i).getDeviceItem());
                    }

                }
            }

            if(sheetName.equals("业务类型")){

            }


        }

        // 将数据输出，刷出，关闭
        wb.write(out);
        out.flush();
        out.close();
    }

    /**
     * 创建内容样式
     * @param wb
     * @return
     */
    private static XSSFCellStyle createContentCellStyle(XSSFWorkbook wb) {
        XSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
        cellStyle.setWrapText(true);// 设置自动换行
        // 生成12号字体
//        XSSFFont font = wb.createFont();
//        font.setColor((short)8);
//        font.setFontHeightInPoints((short) 12);
//        cellStyle.setFont(font);

        return cellStyle;
    }
}
